#include "socket.h"
#include "task.h"
#include "uring_loop.h"
#include <fcntl.h>
#include <unistd.h>

co_async::Task<> amain() {
  {
    int fd = co_await co_async::uring_openat(
        co_async::loop, AT_FDCWD, "/tmp/a.cpp", O_WRONLY | O_CREAT, 644);
    char buf[] = "#include <cstdio>\nint main(){\n\tprintf(\"hello "
                 "co_async\\n\");\n\treturn 0;\n}\n";
    co_await co_async::uring_write(co_async::loop, fd, buf);
    co_await co_async::uring_close(co_async::loop, fd);
    co_async::uring_enqueue(co_async::loop, []() -> co_async::Task<> {
      co_await co_async::uring_write(co_async::loop, STDOUT_FILENO, "good\n");
    });
  }
  {
    char buf[100];
    int fd = co_await co_async::uring_openat(
        co_async::loop, AT_FDCWD,
        "/home/yj/code/c++/co-server/test/test_uring_loop.cc", O_RDONLY);
    co_await co_async::uring_read(co_async::loop, fd, buf);
    co_await co_async::uring_write(co_async::loop, STDOUT_FILENO, buf);
  }
}

int main() {
  auto t = amain();
  t.get_handle().resume();
  while (!t.m_handle.done()) {
    co_async::loop.run();
  }
  t.operator co_await().await_resume();
}
